home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Komputer 2010 April
/
PCWorld0410.iso
/
pluginy Firefox
/
8614
/
8614.xpi
/
modules
/
application
/
ContextExtractor.jsm
next >
Wrap
Text File
|
2010-02-10
|
5KB
|
207 lines
// DO NOT import this into the global namespace, but instead
// import it into your own namespace wrapper
var EXPORTED_SYMBOLS = ["CONTEXT_EXTRACTOR"];
Components.utils.import("resource://glydo/utils/prototype_xul_1_6_0_3_modified.jsm");
Components.utils.import("resource://glydo/utils/io.jsm");
Components.utils.import("resource://glydo/utils/Prefs.jsm");
Components.utils.import("resource://glydo/utils/Utils.jsm");
Components.utils.import("resource://glydo/utils/ScriptManager.jsm");
Components.utils.import("resource://glydo/application/extractors/BuiltinExtractors.jsm");
const EXTRACTORS_JSON_RESOURCE_NAME="extractors.json";
var ContextExtractor = Prototype.Class.create({
initialize: function(scriptManager) {
this.scriptManager = scriptManager;
this.scriptManager.addListener(this);
this.loadExtractors();
},
onResourcesUpdated: function(resourceNames) {
if (resourceNames == null || resourceNames.indexOf(EXTRACTORS_JSON_RESOURCE_NAME) != -1) {
this.loadExtractors();
}
},
loadExtractors: function() {
var json = this.scriptManager.getResource(EXTRACTORS_JSON_RESOURCE_NAME);
if (!json) {
this.extractorsParamsByDomain = {};
} else {
this.extractorsParamsByDomain = Prototype.S.decodeJSON(json);
}
},
extract: function(doc,options) {
var extractorsParams = this.getExtractorsParamsForDocument(doc);
if (!extractorsParams) {
return null;
}
var firstEx = this.getAllExtractorForParams(extractorsParams.extractors);
var secondEx = this.getAllExtractorForParams(extractorsParams.fallbacks);
var thirdEx = this.getAllExtractorForParams(Utils.arrayify(this.extractorsParamsByDomain["globalFallback"]));
var ex = this.getFirstExtractorForParams([firstEx,secondEx,thirdEx]);
var task = new ContextExtractor.Task(this.scriptManager,doc,ex,options,false);
task.execute();
return task;
},
getAllExtractorForParams: function(extractors) {
if (!extractors) {
return null;
}
var e = [];
var l = extractors.length;
for (var i = 0; i < l; ++i) {
if (extractors[i]) {
e.push(extractors[i]);
}
}
if (e.length == 0) {
return null;
}
if (e.length == 1) {
return e[0];
}
return ({
extractor: "com.glydo.extractors.builtins.all",
options: {
candidates: e
},
});
},
getFirstExtractorForParams: function(extractors) {
if (!extractors) {
return null;
}
var e = [];
var l = extractors.length;
for (var i = 0; i < l; ++i) {
if (extractors[i]) {
e.push(extractors[i]);
}
}
if (e.length == 0) {
return null;
}
if (e.length == 1) {
return e[0];
}
return ({
extractor: "com.glydo.extractors.builtins.first",
options: {
candidates: e,
ignoreFailures: true
}
});
},
getExtractorsParamsForDocument: function(doc) {
var extractors = [];
var fallbacks = [];
// Locate candidate extractors
var url = doc.documentURI;
var hld = Utils.getHighLevelDomainName(url).toLowerCase();
var hldExtractors = this.extractorsParamsByDomain[hld];
if (hldExtractors != undefined) {
for (var re in hldExtractors) {
var match = new RegExp(re).exec(url);
if (match != null) {
extractors.push.apply(extractors,Utils.arrayify(hldExtractors[re]));
}
}
fallbacks.push.apply(fallbacks,Utils.arrayify(hldExtractors["fallback"]));
} else {
extractors.push.apply(extractors,Utils.arrayify(this.extractorsParamsByDomain["*"]));
}
return ({extractors: extractors, fallbacks: fallbacks});
},
});
ContextExtractor.Task = Prototype.Class.create({
initialize: function(scriptManager,doc,extractorParams,options) {
this.document = doc;
this.scriptManager = scriptManager;
this.extractorParams = extractorParams;
this.options = options;
},
execute: function() {
// Find extractor code
var id;
var options;
if (!this.extractorParams) {
id = null;
options = null;
} else if (typeof this.extractorParams == "string") {
id = this.extractorParams;
options = null;
} else {
id = this.extractorParams["extractor"];
options = this.extractorParams["options"];
}
if (!id) {
this.taskFailed("No extractor id specified");
return;
}
// Create arguments for extractor
var callbacks = {};
if (this.options["onContextItem"]) {
callbacks["notifyContextItemExtracted"] = this.options["onContextItem"];
}
callbacks["notifyTaskDone"] = Prototype.F.bind(this.onTaskDone,this);
callbacks["notifyTaskFailed"] = Prototype.F.bind(this.onTaskFailed,this);
try {
this.scriptManager.invoke(this.document,id,options,callbacks,[BuiltinExtractors]);
} catch (ex) {
var msg = (typeof ex == "string") ? ex : (ex.name + ": " + ex.message);
this.onTaskFailed(ex);
}
},
onTaskDone: function() {
if (this.options["onCompleted"]) {
try {
this.options["onCompleted"]();
} catch (ex) {
if (Components) {
Components.utils.reportError(ex);
} else {
throw ex;
}
}
}
},
onTaskFailed: function(reason) {
if (this.options["onFailure"]) {
try {
this.options["onFailure"](reason);
} catch (ex) {
if (Components) {
Components.utils.reportError(ex);
} else {
throw ex;
}
}
}
},
});
var CONTEXT_EXTRACTOR = new ContextExtractor(SCRIPT_MANAGER);